package Topics通配符模式

import (
	"fmt"
	"github.com/streadway/amqp"
)

func Twork() {
	// 1. 尝试连接RabbitMQ，建立连接
	// 该连接抽象了套接字连接，并为我们处理协议版本协商和认证等
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	if err != nil {
		fmt.Println(err)
	}
	defer conn.Close()

	// 2. 接下来，我们创建一个通道，大多数API都是用过该通道操作的。
	ch, err := conn.Channel()
	if err != nil {
		fmt.Println(err)
	}
	defer ch.Close()

	//3. 创建交换机
	//参数：
	//1、name：交换机名称
	//2、kind:交换机类型
	//amqp.ExchangeDirect 定向
	//amqp.ExchangeFanout 扇形（广播），发送消息到每个队列
	//amqp.ExchangeTopic 通配符的方式
	//amqp.ExchangeHeaders 参数匹配
	//3、durable：是否持久化
	//4、autoDelete：自动删除
	//5、internal：内部使用 一般false
	//6、noWait bool,
	//7、args：参数
	exchangeName := "test_topic"
	ch.ExchangeDeclare(exchangeName, amqp.ExchangeTopic, true, false, false, false, nil)
	//4. 创建队列
	queue1Name := "test_topic_queue1"
	queue2Name := "test_topic_queue2"
	ch.QueueDeclare(queue1Name, true, false, false, false, nil)
	ch.QueueDeclare(queue2Name, true, false, false, false, nil)
	//5. 绑定队列和交换机
	//routing key 系统名称.日志级别
	//需求：所有error级别的日志村日数据库，所有order系统的日志存入数据库
	//队列1绑定
	ch.QueueBind(queue1Name, "#.error", exchangeName, false, nil)
	ch.QueueBind(queue1Name, "order.*", exchangeName, false, nil)
	//队列2绑定
	ch.QueueBind(queue2Name, "*.*", exchangeName, false, nil)

	//6. 发送消息
	body := "日志信息：delete方法被调用，日志级别:error..."
	err = ch.Publish(
		exchangeName, // exchange 交换机名称 简单模式下交换机会使用默认的""
		"goods.info", // routing key 路由名称
		false,        // mandatory
		false,        // immediate
		amqp.Publishing{ //发送消息数据
			ContentType: "text/plain",
			Body:        []byte(body),
		},
	)

}
